package com.github.davidmoten.rx.jdbc;

import java.util.List;

import rx.Observable;
import rx.Scheduler;

/**
 * A database DML query, either update/insert or select.
 */
public interface Query {

    /**
     * Returns the sql statement for this query following JDBC format (? for
     * parameters for instance).
     * 
     * @return jdbc sql
     */
    String sql();

    /**
     * Returns the list of names corresponding positionally to the ? characters
     * in the sql. If names were not used then returns an empty list.
     * 
     * @return ist of names corresponding positionally to the ? characters in
     *         the sql
     */
    List<String> names();

    /**
     * Returns the parameters for the query in order of appearance as ? markers
     * in the sql. May emit more than the number of parameters in one run of the
     * query in which case the query would be run multiple times.
     * 
     * @return parameters observable
     */
    Observable<Parameter> parameters();

    /**
     * Returns the Observables that have to complete before this query is
     * started.
     * 
     * @return depends observable
     */
    Observable<?> depends();

    /**
     * Returns the query context including {@link ConnectionProvider} and
     * {@link Scheduler}.
     * 
     * @return query context
     */
    QueryContext context();

}
